from django.shortcuts import get_object_or_404
from django.views import View
from django.http import JsonResponse
from app.models import *
from django.utils import timezone
from datetime import datetime, timedelta

# 定义金币奖励规则，每连续签到7天循环一次
COIN_REWARDS = [5, 6, 8, 12, 18, 25, 35]


class GetCoins(View):
    def get(self, request):
        user_id = request.GET.get('id', '')
        try:
            user_gold = Gold.objects.get(id=user_id)
            return JsonResponse({
                'msg': '获取金币数量',
                'code': 200,
                'money': user_gold.money,
            })
        except Exception as e:
            return JsonResponse({
                'code': 400,
                'msg': str(e)
            })


class GetDetails(View):
    def get(self, request):
        user_id = request.GET.get('id', '')
        user_detail = Details.objects.filter(user_id=user_id)

        data = []
        for detail in user_detail:
            data.append({
                'id': detail.id,
                'user_id': detail.user_id,
                'source': detail.source,
                'amount': detail.amount,
                'details_in_date': detail.details_in_date,
            })
        return JsonResponse({
            'msg': '查询明细成功',
            'code': 200,
            'data': data
        })


class SignInRecord(View):
    def post(self, request):
        user_id = request.POST.get('id', '')  # 获取当前用户ID
        today = datetime.now().date()  # 获取当前日期
        source = request.POST.get('source', '每日签到(小程序)')  # 获取当前获取金币途径

        try:
            user = User.objects.get(id=user_id)
        except User.DoesNotExist:
            return JsonResponse({
                'msg': '用户不存在',
                'code': 404,
                'coins': 0,
                'money': 0,
            })

        # 检查用户今天是否签到过
        if Signup.objects.filter(user=user, sign_in_date=today).exists():
            user_gold, created = Gold.objects.get_or_create(id=user_id, user=user, defaults={'money': 0})
            return JsonResponse({
                'msg': '今日已经签到',
                'code': 201,
                'coins': 0,
                'money': user_gold.money,
            })

        # 计算昨天的日期
        yesterday = today - timedelta(days=1)

        # 获取用户的签到记录，按日期降序排列
        signins = Signup.objects.filter(user=user).order_by('-sign_in_date')

        # 计算连续签到天数
        consecutive_days = 0
        if signins.exists() and signins[0].sign_in_date == yesterday:
            consecutive_days = 1
            for i in range(1, len(signins)):
                if signins[i].sign_in_date == today - timedelta(days=i + 1):
                    consecutive_days += 1
                else:
                    break

        # 根据连续签到天数确定奖励金币数量
        coins_rewarded = COIN_REWARDS[consecutive_days % len(COIN_REWARDS)]

        # 更新用户金币数量
        user_gold, created = Gold.objects.get_or_create(id=user_id, user=user, defaults={'money': 0})
        user_gold.money += coins_rewarded
        user_gold.save()

        # 创建签到记录
        Signup.objects.create(id=uuid.uuid4(), user=user, sign_in_date=today)

        # 创建金币明细记录
        Details.objects.create(id=uuid.uuid4(), user=user, details_in_date=datetime.now(), source=source,
                               amount=coins_rewarded)

        # 返回签到成功的消息和金币数量
        return JsonResponse({
            'msg': '签到成功',
            'code': 200,
            'coins': coins_rewarded,
            'money': user_gold.money,
        })
        # 签到逻辑：
        # 1. 获取当前用户和日期。
        # 2. 检查用户是否已经签到，防止重复签到。
        # 3. 获取用户最近一次签到记录。
        # 4. 如果用户有签到记录且最后一次签到不是昨天，则清空签到记录并重置连续签到天数。
        # 5. 否则，获取用户的签到日期列表并计算连续签到天数。
        # 6. 创建新的签到记录。
        # 7. 根据连续签到天数确定奖励金币数量。
        # 8. 更新用户的总金币数。
        # 9. 创建金币交易记录，记录此次签到的奖励详情。
        # 10. 返回签到成功的消息和交易明细。


# 花费金币
class PostCoins(View):
    def post(self, request):
        try:
            user_id = request.POST.get('id', '')  # 用户id
            gift_id = request.POST.get('gift_id', '')  # 礼物id
            limit = request.POST.get('limit', 10)  # 花费额度
            msg = request.POST.get('msg', '')  # 花费途径
            coin_params = {
                'gift_id': gift_id,
                'limit': limit,
                'user_id': user_id,
                'msg': msg
            }
            status = consumer_coins(coin_params)
            if status is True:
                return JsonResponse({
                    'code': 200,
                    'msg': "购买成功"
                })
        except Exception as e:
            return JsonResponse({
                'code': 400,
                'msg': str(e)
            })
